{
 "metadata": {
  "name": "",
  "signature": "sha256:a8d391678272783264ac4b0fe1d73bb2dccf5e64dfe3a31e739013f42b321f5a"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "MRC Gain\n",
      "========\n",
      "\n",
      "This notebook illustrates the gains obtained when using MRC in a SIMO system. It reproduces the results found [here](http://www.dsplog.com/2008/09/28/maximal-ratio-combining/).\n",
      "\n",
      "Initializations\n",
      "---------------\n",
      "\n",
      "First we set the Python path and import some libraries."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%pylab inline\n",
      "from IPython.display import clear_output"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Populating the interactive namespace from numpy and matplotlib\n"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# xxxxxxxxxx Add the parent folder to the python path. xxxxxxxxxxxxxxxxxxxx\n",
      "import sys\n",
      "import os\n",
      "sys.path.append('../')\n",
      "# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n",
      "\n",
      "import numpy as np\n",
      "from pyphysim.util.misc import randn_c\n",
      "from pyphysim.util.conversion import linear2dB"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we set the simulation parameters"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "all_N = np.arange(1,21)  # Number of receive antennas\n",
      "rep_max = 10000  # Number of iterations\n",
      "rep_max = 10000  # Number of iteration"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Simulation\n",
      "----------\n",
      "\n",
      "Now we simulate the MRC gain."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "SNR_gain_dB = np.empty(all_N.size)\n",
      "for index in range(all_N.size):\n",
      "    all_gains = np.empty(rep_max)\n",
      "    for rep in range(rep_max):\n",
      "        N = all_N[index]\n",
      "        # Generate the random channel matrix (here a column vector)\n",
      "        H = randn_c(N, 1)\n",
      "        all_gains[rep] = np.dot(H.transpose().conjugate(), H)[0,0].real\n",
      "    SNR_gain_dB[index] = linear2dB(np.mean(all_gains))\n",
      "\n",
      "SNR_gain_dB_theory = linear2dB(all_N)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Plotting\n",
      "--------\n",
      "\n",
      "Now we can finally plot the SNR gain obtained with MRC."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from matplotlib import pyplot as plt\n",
      "plt.plot(SNR_gain_dB,'--bs', label='Simulated')\n",
      "plt.plot(SNR_gain_dB_theory,'--mo', label='Theory')\n",
      "\n",
      "plt.legend(loc='best')\n",
      "plt.grid()\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x4c121d0>"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Error rate with Maximal Ratio Combining (MRC)\n",
      "=============================================\n",
      "\n",
      "Now lets simulate an actual transmission with MRC. We simulate a BPSK transmission with MRC through a Rayleight channel.\n",
      "\n",
      "First lets reset the variables in the workspace to guarantee we are not using anything from previous cells"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Reset the variables in the workspace\n",
      "%reset -f\n",
      "from IPython.display import clear_output"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now lets make some initialization setting the Python path."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Add parent folder to path and import the required modules\n",
      "import numpy as np\n",
      "import sys\n",
      "sys.path.append('../')\n",
      "from pyphysim.util.conversion import dB2Linear\n",
      "from pyphysim.util.misc import randn_c, count_bit_errors\n",
      "from pyphysim.simulations.progressbar import ProgressbarText,ProgressbarText2"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we define a function to simulate for the given transmission parameters."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def simulate_MRC(SNR, N, NSymbs, num_reps):\n",
      "    \"\"\"Simulate the BPSK transmission with MRC with the given parameters\n",
      "\n",
      "    Params\n",
      "    ------\n",
      "    SNR : double\n",
      "        The desired SNR value (in dB)\n",
      "    N : int\n",
      "        The number of receive antennas (the number of transmit antennas is always 1).\n",
      "    NSymbs : int\n",
      "        The number of transmitted symbols at each iteration\n",
      "    num_reps : int\n",
      "        The number of iterations.\n",
      "    \"\"\"\n",
      "    bit_errors = 0.0\n",
      "    num_bits = NSymbs * num_reps\n",
      "    for rep in range(num_reps):\n",
      "        # Dependent Variables\n",
      "        noise_var = 1.0 / dB2Linear(SNR)\n",
      "\n",
      "        # Generates random data with 0 and 1\n",
      "        input_data = np.random.randint(0, 2, NSymbs)\n",
      "\n",
      "        # Modulate the data with BPSK\n",
      "        symbols = 1 - 2 * input_data\n",
      "\n",
      "        # Generate the complex channel\n",
      "        h = randn_c(N, 1)\n",
      "\n",
      "        # Pass the data through the channel\n",
      "        received_data = h * symbols + (np.sqrt(noise_var) * randn_c(1, NSymbs))  # This will use numpy broadcasting\n",
      "\n",
      "        # Apply the MRC\n",
      "        improved_received_data = np.dot(h.transpose().conjugate(), received_data)\n",
      "\n",
      "        # Decode the received data\n",
      "        decoded_data = np.zeros(NSymbs, dtype=int)\n",
      "        improved_received_data = np.squeeze(improved_received_data)\n",
      "        decoded_data[improved_received_data < 0] = 1\n",
      "\n",
      "        # Count the number of bit errors\n",
      "        bit_errors += count_bit_errors(input_data, decoded_data)\n",
      "\n",
      "    # Calculate the BER\n",
      "    BER = float(bit_errors) / num_bits\n",
      "\n",
      "    return BER"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 8
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we can finally perform the simulation for varying sets of transmission parameters."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "# Transmission parameters\n",
      "NSymbs = 200  # Number of simulated symbols\n",
      "NBits = NSymbs\n",
      "all_SNR = np.linspace(0, 35, 14)\n",
      "num_reps = 30000\n",
      "\n",
      "# Number of SNR points\n",
      "num_points = all_SNR.size\n",
      "\n",
      "BER_NRx1 = np.zeros(num_points)\n",
      "BER_NRx2 = np.zeros(num_points)\n",
      "\n",
      "pbar = ProgressbarText2(num_points, message=\"Simulating\")\n",
      "\n",
      "for index in range(num_points):\n",
      "    pbar.progress(index)\n",
      "    SNR = all_SNR[index]\n",
      "    BER_NRx1[index] = simulate_MRC(SNR, 1, NSymbs, num_reps)\n",
      "    BER_NRx2[index] = simulate_MRC(SNR, 2, NSymbs, num_reps)\n",
      "\n",
      "pbar.progress(num_points)\n",
      "\n",
      "# Clear the progressbar output at the end\n",
      "clear_output()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now we plot the results."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from matplotlib import pyplot as plt\n",
      "\n",
      "plt.semilogy(all_SNR, BER_NRx1, '-ms')\n",
      "plt.semilogy(all_SNR, BER_NRx2,'-ks')\n",
      "plt.legend(['N=1', 'N=2'])\n",
      "plt.grid()\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x4d356d0>"
       ]
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "#%qtconsole"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 11
    }
   ],
   "metadata": {}
  }
 ]
}